﻿using PhraseCorrector.Common;
using PhraseCorrector.SpellLook;
using System;
using System.IO;

namespace PhraseCorrector.SpellCorrect
{

    /// <summary>
    /// 用于加载和操作字典库的类。
    /// <remarks>
    /// 此类用于加载和操作字典库，包括加载和保存字典文件，以及处理拼写检查和纠正等任务。
    /// </summary>
    public class Loadlibrary
    {

        ///////////////////////////////////////////////////////////////////////////////////////////////////////////////
        /// <summary>
        /// 获取或设置一个 SpellForEnglish 对象，用于处理拼写检查和纠正。
        /// </summary>
        public Spell SpellHandle { set; get; }

        ///////////////////////////////////////////////////////////////////////////////////////////////////////////////
        /// <summary>
        /// 初始化 Loadlibrary 类并加载字典文件。
        /// </summary>
        /// <param name="libraryFilename">要加载的字典文件名。</param>
        /// <param name="maxEditDistance">最大编辑距离。</param>
        /// <param name="prefixLength">前缀长度。</param>
        public Loadlibrary(string libraryFilename, int maxEditDistance, int prefixLength, PhraseType model)
        {
            Loadlibrary_Begin(maxEditDistance, prefixLength, model);
            if (!Loadlibrary_Load(libraryFilename)) return;
        }

        ///////////////////////////////////////////////////////////////////////////////////////////////////////////////
        /// <summary>
        /// 开始加载字典库的准备工作。
        /// </summary>
        /// <param name="maxEditDistance">最大编辑距离。</param>
        /// <param name="prefixLength">前缀长度。</param>
        public void Loadlibrary_Begin(int maxEditDistance, int prefixLength, PhraseType model)
        {
            SpellHandle= new Spell(model, maxEditDistance, prefixLength);
        }

        ///////////////////////////////////////////////////////////////////////////////////////////////////////////////
        /// <summary>
        /// 尝试加载字典文件。
        /// </summary>
        /// <param name="libraryFilename">字典文件名。</param>
        /// <returns>如果加载失败则返回 false，否则返回 true。</returns>
        public bool Loadlibrary_Load(string libraryFilename)
        {
            return SpellHandle== null || !SpellHandle.LoadDictionary(libraryFilename, 0, 1)
                 ? Loadlibrary_LoadError(libraryFilename)
                 : true;
        }

        ///////////////////////////////////////////////////////////////////////////////////////////////////////////////
        /// <summary>
        /// 处理字典文件加载错误。
        /// </summary>
        /// <param name="libraryFilename">字典文件名。</param>
        /// <returns>返回 false 表示加载错误。</returns>
        public bool Loadlibrary_LoadError(string libraryFilename)
        {
            Console.Error.WriteLine("\rFile not found: " + Path.GetFullPath(libraryFilename));
            return false;
        }

    }
}
